package events;

/**
* @brief Clase que modela un objeto que acepta listeners de
*        eventos distribuidos
* @author Carlos Rodriguez Dominguez
* @date 17/11/2008
*
* Estos objetos se podran registrar en el manejador de eventos 
* para enviar y recibir eventos distribuidos. Todo componente
* que desee recibir este tipo de eventos debera heredar de esta
* clase o disponer de una instancia de ella. Para recibir un
* tipo concreto de eventos, debera crearse un listener apropiado.
*/
public class ListeningObject {

	private java.util.ArrayList<EventListener> listeners; /**< Vector de listeners */
	
	/**
	* Constructor
	*/
	public ListeningObject()
	{
		listeners = new java.util.ArrayList<EventListener>();
	}
	
	/**
	* Agrega un listener nuevo al objeto
	*
	* @param ev Listener a agregar
	*/
	public void addEventListener(EventListener ev)
	{
		listeners.add(ev);
	}
	
	/**
	* Elimina un listener del objeto
	*
	* @param ev Listener a eliminar
	*/
	public void removeEventListener(EventListener ev)
	{
		int pos = get_listener_pos(ev);
		if (pos != -1)
			listeners.remove(pos);
	}
	
	/**
	* Elimina un listener del objeto
	*
	* @param name Nombre del listener a eliminar
	*/
	public void removeEventListener(String name)
	{
		int pos = get_listener_pos(name);
		if (pos != -1)
			listeners.remove(pos);
	}
	
	/**
	* Busca los listeners que soporten el evento y
	* los obliga a ejecutar la accion asociada.
	*
	* @param data Evento
	*/
	public void listen(org.omg.CORBA.Any data)
	{
		Event ev = new Event();
		
		try{
			ev.from_any(data);
		}
		catch(Exception ex)
		{
			return;
		}
		
		int i;
		int len = listeners.size(); 
		for(i=0; i<len; i++)
		{
			if (listeners.get(i).check_event(ev))
			{
				listeners.get(i).action(this, ev);
			}
		}
	}

	/**
	* Busca la posicion de un listener en el vector
	* de listeners.
	*
	* @param ev Listener a buscar
	* @return Posicion del listener o -1 si no existe
	*/
	private int get_listener_pos(EventListener ev)
	{
		return listeners.indexOf(ev);
	}
	
	/**
	* Busca la posicion de un listener en el vector
	* de listeners.
	*
	* @param name Nombre de listener a buscar
	* @return Posicion del listener o -1 si no existe
	*/
	private int get_listener_pos(String name)
	{
		int i;
		int len = listeners.size();
		for (i=0; i<len; i++)
		{
			if (listeners.get(i).name().equals(name))
			{
				return i;
			}
		}
		
		return -1;
	}
}
